package com.lm.leetcode.dualpointer;

import com.lm.leetcode.PrintUtils;

/**
 * @Auther: Min.Liu
 * @Description:
 * 移除元素
 * 给你一个数组 nums和一个值 val，你需要 原地 移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。
 * 假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：
 * 更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
 * 返回 k。
 *
 */
public class removeDemo {
    public static void main(String[] args) {
        removeDemo demo = new removeDemo();
        int[] nums= {0,1,2,2,3,0,4,2};
        //int[] nums = {3,2,2,3}
        System.out.println(demo.removeElement2(nums, 2));
        PrintUtils.printIntArray(nums);
    }
    public int removeElement(int[] nums, int val) {
        int slow= 0;
        int fast =0;
        while (slow<nums.length&&nums[slow]!=101){
            if (nums[fast]==val) {
                remove(nums,fast);
                continue;
            }
            if(nums[fast]==101){
                fast--;
            }
            slow++;
            fast++;

        }
        return slow--;
    }

    public void remove(int[] nums, int remove){
        for (int i = remove; i < nums.length; i++) {
            if(i==nums.length-1){
                nums[i]=101;//代表移除了该元素
            }else {
                nums[i] = nums[i+1];
            }
        }
    }

    //借鉴1
    public int removeElement2(int[] nums, int val) {
        int left = 0;
        for(int i=0;i<nums.length;i++){
            if(nums[i] == val){
                continue;
            }
            nums[left++] = nums[i];
        }
        return left;
    }

}
